package com.pdd.mall.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pdd.mall.dto.PromotionParam;
import com.pdd.mall.entity.Promotion;

import java.math.BigDecimal;
import java.util.List;
import java.util.Map;

/**
 * 促销活动服务接口
 */
public interface PromotionService {

    /**
     * 获取商家的促销活动列表
     */
    Page<Promotion> getPromotionList(Long merchantId, String keyword, String type, Integer status, String startTime, String endTime, Integer pageNum, Integer pageSize);

    /**
     * 获取促销活动详情
     */
    Promotion getPromotionDetail(Long id, Long merchantId);

    /**
     * 添加促销活动
     */
    Promotion addPromotion(PromotionParam param, Long merchantId);

    /**
     * 更新促销活动
     */
    Promotion updatePromotion(Long id, PromotionParam param, Long merchantId);

    /**
     * 删除促销活动
     */
    boolean deletePromotion(Long id, Long merchantId);

    /**
     * 获取促销活动关联的商品ID列表
     */
    List<Long> getPromotionProductIds(Long promotionId);

    /**
     * 更新促销活动状态
     */
    boolean updatePromotionStatus(Long id, Integer status, Long merchantId);

    /**
     * 获取商品的促销信息
     * @param productId 商品ID
     * @return 促销信息，包含促销活动和促销价格
     */
    Map<String, Object> getProductPromotion(Long productId);

    /**
     * 计算商品的促销价格
     * @param productId 商品ID
     * @param originalPrice 原价
     * @return 促销价格，如果没有促销则返回原价
     */
    BigDecimal calculatePromotionPrice(Long productId, BigDecimal originalPrice);

    /**
     * 计算订单的促销折扣
     * @param productId 商品ID
     * @param quantity 数量
     * @param originalPrice 原价
     * @return 折扣金额
     */
    BigDecimal calculateOrderDiscount(Long productId, int quantity, BigDecimal originalPrice);

    /**
     * 获取所有进行中的促销活动
     * @return 进行中的促销活动列表
     */
    List<Promotion> getActivePromotions();

    /**
     * 更新促销活动关联商品的价格
     * 当促销活动开始时，将商品价格更新为促销价格
     * 当促销活动结束时，将商品价格恢复为原价
     * @param promotionId 促销活动ID
     * @param isStart 是否是开始促销（true-开始，false-结束）
     * @return 更新的商品数量
     */
    int updateProductPricesByPromotion(Long promotionId, boolean isStart);
}
